﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Data.SqlClient;
using System.IO;

namespace MikroTransfer
{
    public partial class frmScmAktarim : XtraForm
    {
        List<ScmEvrak> _evraklar = new List<ScmEvrak>();
        Dictionary<string, ScmPlasiyer> _plasiyer = new Dictionary<string, ScmPlasiyer>();


        public frmScmAktarim()
        {
            InitializeComponent();
        }

        private void DataCreate_old()
        {
            Dictionary<string, string> anacari = new Mikro(Db.Kontur).AnaCarikodlari();

            #region Detayli Satis Bilgileri
            string line = "";
            for (int i = 0; i < c1FlexGrid1.Rows.Count; i++)
            {
                line = c1FlexGrid1[i, 0].ToString();
                if (line.IndexOf("Şube :") > -1)
                {
                    ScmEvrak evr = new ScmEvrak();
                    evr.Acik = true;

                    evr.Sube = line.Split(':')[1].Trim();
                    evr.CariKod = c1FlexGrid1[i, 7].ToString().Split(':')[1].Trim();
                    if (anacari.ContainsKey(evr.CariKod))
                    {
                        evr.CariKod = anacari[evr.CariKod];
                    }

                    i++;
                    line = c1FlexGrid1[i, 0].ToString();
                    evr.FaturaNo = line.Split(':')[1].Trim();

                    i++;
                    line = c1FlexGrid1[i, 0].ToString();
                    evr.BelgeNo = line.Split(':')[1].Trim();

                    i++;
                    line = c1FlexGrid1[i, 0].ToString();
                    evr.BelgeTarihi = Convert.ToDateTime(line.Split(':')[1].Trim());
                    evr.PlasiyerKod = c1FlexGrid1[i, 7].ToString().Split(':')[1].Trim().Replace("0", "");

                    i++; //satır başlıklarını atla

                    while (true)
                    {
                        i++;
                        line = c1FlexGrid1[i, 0].ToString();
                        if (line.IndexOf("Toplamlar") > -1)
                        {
                            evr.AraToplam = Cevir.Parse<decimal>(c1FlexGrid1[i, 4].ToString().Trim().Replace('.', ','));
                            evr.IndirimToplam = Cevir.Parse<decimal>(c1FlexGrid1[i, 5].ToString().Trim().Replace('.', ','));
                            evr.KdvToplam = Cevir.Parse<decimal>(c1FlexGrid1[i, 6].ToString().Trim().Replace('.', ','));
                            evr.GenelToplam = Cevir.Parse<decimal>(c1FlexGrid1[i, 7].ToString().Trim().Replace('.', ','));
                            break;
                        }
                        else
                        {
                            evr.Satirlar.Add(new ScmSatir()
                            {
                                StokKodu = line.Trim().Split(' ')[0],
                                Miktar = Cevir.Parse<decimal>(c1FlexGrid1[i, 1].ToString().Trim().Replace('.', ',')),
                                Fiyat = Cevir.Parse<decimal>(c1FlexGrid1[i, 2].ToString().Trim().Replace('.', ',')),
                                KdvOrani = Cevir.Parse<int>(c1FlexGrid1[i, 3].ToString().Trim().Replace("%", "").Replace(",", "")),
                                Tutar = Cevir.Parse<decimal>(c1FlexGrid1[i, 4].ToString().Trim().Replace('.', ',')),
                                IndirimTutari = Cevir.Parse<decimal>(c1FlexGrid1[i, 5].ToString().Trim().Replace('.', ',')),
                                KdvTutari = Cevir.Parse<decimal>(c1FlexGrid1[i, 6].ToString().Trim().Replace('.', ',')),
                                Yekun = Cevir.Parse<decimal>(c1FlexGrid1[i, 7].ToString().Trim().Replace('.', ','))
                            });
                        }
                    }
                    _evraklar.Add(evr);
                }
            }

            #endregion

            for (int i = 0; i < c1FlexGrid2.Rows.Count; i++)
            {
                ScmEvrak evr = _evraklar.Where(x => x.FaturaNo == c1FlexGrid2.GetDataDisplay(c1FlexGrid2.Row, 1)).FirstOrDefault();
                if (evr != null)
                {
                    if (c1FlexGrid2.GetDataDisplay(i, 9).IndexOf("Peşin") > -1)
                    {
                        evr.Acik = false;
                    }
                }
            }

        }

        private void DataCreate()
        {
            Mikro mikro = new Mikro(Db.Kontur);
            Dictionary<string, string> anacari = mikro.AnaCarikodlari();
            bool yeni = false;
            #region Detayli Satis Bilgileri
            for (int i = 1; i < c1FlexGrid1.Rows.Count; i++)
            {
                if (!string.IsNullOrEmpty(c1FlexGrid1[i, 0].ToString()))
                {
                    yeni = false;
                    string faturano = c1FlexGrid1[i, 1].ToString().Trim();
                    ScmEvrak evr = _evraklar.Where(x => x.FaturaNo == faturano).FirstOrDefault();
                    if (evr == null)
                    {
                        yeni = true;
                        evr = new ScmEvrak();
                    }


                    evr.Acik = true;

                    evr.Sube = c1FlexGrid1[i, 0].ToString().Trim();
                    evr.CariKod = c1FlexGrid1[i, 4].ToString().Trim();
                    if (anacari.ContainsKey(evr.CariKod))
                    {
                        evr.CariKod = anacari[evr.CariKod].Split(';')[0];
                    }

                    evr.FaturaNo = c1FlexGrid1[i, 1].ToString().Trim();
                    evr.BelgeNo = c1FlexGrid1[i, 2].ToString().Trim();
                    evr.BelgeTarihi = Convert.ToDateTime(c1FlexGrid1[i, 3].ToString().Trim());

                    evr.PlasiyerKod = c1FlexGrid1[i, 6].ToString().Trim();



                    evr.AraToplam += Cevir.Parse<decimal>(c1FlexGrid1[i, 13].ToString().Trim().Replace('.', ','));
                    evr.IndirimToplam += Cevir.Parse<decimal>(c1FlexGrid1[i, 14].ToString().Trim().Replace('.', ','));
                    evr.KdvToplam += Cevir.Parse<decimal>(c1FlexGrid1[i, 15].ToString().Trim().Replace('.', ','));
                    evr.GenelToplam += Cevir.Parse<decimal>(c1FlexGrid1[i, 16].ToString().Trim().Replace('.', ','));


                    evr.Satirlar.Add(new ScmSatir()
                    {
                        StokKodu = c1FlexGrid1[i, 8].ToString().Trim().Split(' ')[0],
                        Miktar = Cevir.Parse<decimal>(c1FlexGrid1[i, 9].ToString().Trim().Replace('.', ',')),
                        Fiyat = Cevir.Parse<decimal>(c1FlexGrid1[i, 12].ToString().Trim().Replace('.', ',')),
                        KdvOrani = Cevir.Parse<int>(c1FlexGrid1[i, 13].ToString().Trim().Replace("%", "").Replace(",", "")),
                        Vade = Cevir.Parse<int>(c1FlexGrid1[i, 11].ToString().Trim()),

                        Tutar = Cevir.Parse<decimal>(c1FlexGrid1[i, 14].ToString().Trim().Replace('.', ',')),
                        IndirimTutari = Cevir.Parse<decimal>(c1FlexGrid1[i, 15].ToString().Trim().Replace('.', ',')),
                        KdvTutari = Cevir.Parse<decimal>(c1FlexGrid1[i, 16].ToString().Trim().Replace('.', ',')),
                        Yekun = Cevir.Parse<decimal>(c1FlexGrid1[i, 17].ToString().Trim().Replace('.', ','))
                    });

                    if (yeni)
                    {
                        _evraklar.Add(evr);
                    }
                }
            }
            #endregion


            //for (int i = 0; i < c1FlexGrid2.Rows.Count; i++)
            //{
            //    ScmEvrak evr = _evraklar.Where(x => x.FaturaNo == c1FlexGrid2.GetDataDisplay(c1FlexGrid2.Row, 1)).FirstOrDefault();
            //    if (evr != null)
            //    {
            //        if (c1FlexGrid2.GetDataDisplay(i, 9).IndexOf("Peşin") > -1)
            //        {
            //            evr.Acik = false;
            //        }
            //    }
            //}

        }

        private void PlasiyerYukle()
        {
            if (File.Exists(Application.StartupPath + "\\scm_plasiyer_eslestirme.txt"))
            {
                using (StreamReader sr = new StreamReader(Application.StartupPath + "\\scm_plasiyer_eslestirme.txt"))
                {
                    while (sr.Peek() > -1)
                    {
                        string[] fields = sr.ReadLine().Split(';');
                        if (!_plasiyer.ContainsKey(fields[1]))
                        {
                            _plasiyer.Add(fields[1], new ScmPlasiyer()
                            {
                                PlasiyerKodu = fields[0],
                                NakitKasaKodu = fields[2],
                                DepoNo = Cevir.Parse<int>(fields[3])
                            });
                        }
                    }
                    sr.Close();
                }
            }
        }

        private void txtDosyaAdi_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.FileName = "";
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtDosyaAdi.Text = dlg.FileName;
                c1FlexGrid1.LoadExcel(dlg.FileName);
            }
        }

        private void buttonEdit1_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.FileName = "";
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                buttonEdit1.Text = dlg.FileName;
                c1FlexGrid2.LoadExcel(dlg.FileName);
            }
        }

        private void EvrakKaydet()
        {
            if (_evraklar.Count > 0 && _plasiyer.Count > 0)
            {
                progressBarControl1.Properties.Minimum = 0;
                progressBarControl1.Properties.Maximum = _evraklar.Count;

                DbSqlServer sql = new DbSqlServer(Db.Kontur);
                Mikro mikro = new Mikro(Db.Kontur);
                SqlTransaction trn = sql.OpenTransaction();
                int CharId;
                string evrakSeri = txtSeri.Text;
                int evrakSira = 1;
                Dictionary<int, int> kdvlist = mikro.KdvList();
                decimal[] vergiTutarlari = new decimal[10];
                int vergi_sira;
                Dictionary<string, string> temsilciler = mikro.CariTemsilcileri();


                foreach (ScmEvrak evr in _evraklar)
                {
                    vergiTutarlari = new decimal[10];

                    evrakSira = mikro.MaxEvrakNo(EvrakTipleri.SatisFaturasi, evrakSeri, trn);
                    foreach (ScmSatir row in evr.Satirlar)
                    {
                        if (kdvlist.ContainsKey(row.KdvOrani))
                            vergi_sira = kdvlist[row.KdvOrani];
                        else
                            vergi_sira = 0;

                        vergiTutarlari[vergi_sira] += row.KdvTutari;
                    }
                    if (_plasiyer.ContainsKey(evr.PlasiyerKod))
                    {
                        string temsilci = evr.PlasiyerKod;

                        if (temsilciler.ContainsKey(evr.CariKod))
                            temsilci = temsilciler[evr.CariKod];

                        if (evr.Acik)
                        {
                            CharId = mikro.CharEkle(EvrakTipleri.SatisFaturasi, trn, evrakSeri, evrakSira, evr.BelgeTarihi, evr.GenelToplam, vergiTutarlari, temsilci, evr.CariKod, evr.AraToplam, evr.BelgeNo, 0, "", evr.IndirimToplam, 0, 0, 0, evr.CariKod, Program.Session[Settings.WebSrmMerkezKodu].ToString(),0);
                        }
                        else
                        {
                            CharId = mikro.CharEkle(EvrakTipleri.SatisFaturasi, trn, evrakSeri, evrakSira, evr.BelgeTarihi, evr.GenelToplam, vergiTutarlari, temsilci, evr.CariKod, evr.AraToplam, evr.BelgeNo, 0, "", evr.IndirimToplam, 0, 0, 4, _plasiyer[evr.PlasiyerKod].NakitKasaKodu, Program.Session[Settings.WebSrmMerkezKodu].ToString(),0);
                        }
                        if (CharId > -1)
                        {
                            int idx = 0;
                            foreach (ScmSatir row in evr.Satirlar)
                            {
                                if (kdvlist.ContainsKey(row.KdvOrani))
                                    vergi_sira = kdvlist[row.KdvOrani];
                                else
                                    vergi_sira = 0;

                                mikro.SharEkle(EvrakTipleri.SatisFaturasi, trn, evrakSeri, evrakSira, evr.BelgeTarihi, idx, row.StokKodu, evr.CariKod, temsilci, row.Miktar,
                                    row.Tutar, vergi_sira, row.KdvTutari, CharId, _plasiyer[evr.PlasiyerKod].DepoNo, _plasiyer[evr.PlasiyerKod].DepoNo, row.IndirimTutari, 0, 0, Program.Session[Settings.WebSrmMerkezKodu].ToString(), row.Vade);

                                idx++;
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Tanımlanmamış plasiyer var işlem iptal edildi ! \r\nPlasiyer Adı:" + evr.PlasiyerKod);
                        return;
                    }
                    progressBarControl1.Position += 1;
                    progressBarControl1.Refresh();

                }

                try
                {
                    trn.Commit();
                }
                catch (Exception ex)
                {
                    Logging.GetLog.ErrorLog(ex);
                    if (trn != null)
                    {
                        trn.Rollback();
                    }
                }

            }
            else
            {
                MessageBox.Show("Plasiyer verileri boş veya exel dosyasında aktarılacak kayıt yok");
            }
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(txtDosyaAdi.Text) && !string.IsNullOrEmpty(txtSeri.Text))
            {
                DataCreate();
                EvrakKaydet();
            }
            else
            {
                MessageBox.Show("Lütfen dosya ve seri no giriniz !");
            }
        }

        private void frmScmAktarim_Load(object sender, EventArgs e)
        {
            PlasiyerYukle();
        }
    }
}
